home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / ashe-1.1 / xmarkup.c < prev    next >
C/C++ Source or Header  |  1995-05-15  |  17KB  |  581 lines

  1. /** xmarkup.c - (c) 1994 Copyright by John R. Punin
  2.  *
  3.  * ASHE HTML Editor
  4.  * 
  5.  * This file has the routines to make additional markup tags for HTML document.
  6.  * 
  7.  * John R. Punin      April -29 - 1994
  8.  *
  9. */
  10.  
  11. #include "xhtml.h"
  12. #include "xmarkup.h"
  13. #include "xheader.h"
  14.  
  15. static int ismap = 0;
  16. static int align = TOP_AL;
  17. /*
  18.    
  19.    NAME : create_linker
  20.    PARAMETERS : Widget w
  21.                 From what widget this function is called.
  22.    RETURN : void
  23.    DESCRIPTION : This function creates the Dialog Window that 
  24.                  ask for the URL name of the document to be pointed
  25.          and the reference name, also it shows the selected text
  26.          that is going to be the link
  27.  
  28.  
  29. */
  30. void 
  31. create_linker(Widget w,HTMLED *he)
  32. {
  33.    Widget dialog,name_box,text_name,label_name;
  34.    XmString l = XmStringCreateSimple("Reference Name :");
  35.    XmString t = XmStringCreateLtoR("\n\nURL Name :",XmSTRING_DEFAULT_CHARSET); 
  36.    XmString u = 
  37.       XmStringCreateLtoR("Link Name :\n\t",XmSTRING_DEFAULT_CHARSET);
  38.    XmString label,tu;
  39.    XmString clear = XmStringCreateSimple("Clear");
  40.    char *selection_linker=NULL;
  41.  
  42.    dialog = XmCreatePromptDialog(he->textarea,"Linker",NULL,0);
  43.    if(selection_linker = XmTextGetSelection(he->textarea))
  44.    {
  45.       tu = XmStringCreateLtoR(selection_linker,XmSTRING_DEFAULT_CHARSET);
  46.       XtFree(selection_linker);
  47.       label = XmStringConcat(u,tu);
  48.       XmStringFree(u);
  49.       u = XmStringConcat(label,t);
  50.       XmStringFree(tu);
  51.    }
  52.    else
  53.    {
  54.       label = XmStringConcat(u,t);
  55.       XmStringFree(u);
  56.       u = XmStringCopy(label);
  57.    }
  58.  
  59.    XtVaSetValues(dialog, XmNselectionLabelString,u,
  60.                  XmNapplyLabelString,clear,NULL);
  61.    XmStringFree(label);   XmStringFree(t);
  62.    XmStringFree(u); 
  63.  
  64.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  65.    label_name = XmCreateLabel(name_box,"label_name",NULL,0);
  66.    XtVaSetValues(label_name,XmNlabelString,l,NULL);
  67.    XmStringFree(l);
  68.    XtManageChild(label_name);
  69.    text_name = XmCreateText(name_box,"text_name",NULL,0);
  70.    XtVaSetValues(text_name, XmNtopAttachment, XmATTACH_WIDGET, 
  71.          XmNtopWidget, label_name,
  72.          XmNcolumns,25,
  73.          NULL);
  74.    
  75.    XtManageChild(text_name);
  76.    XtManageChild(name_box);
  77.  
  78.    he->user_data = (XtPointer)text_name;
  79.    /* When the user types the URL name, call linker_name()... */
  80.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)linker_name,(XtPointer)he);
  81.    
  82.    /* If the user selects cancel, just detroy the dialog */
  83.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  84.  
  85.    /* Clear button is available */
  86.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  87.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  88.  
  89.    /* No help is available */
  90.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  91.  
  92.    XtManageChild(dialog);
  93.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  94.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  95.                    0,0,800,800,0,0);
  96. }
  97.  
  98. /* 
  99.    NAME : linker_name
  100.    PARAMETERS : Widget text_name
  101.                 Widget where the reference name is saved
  102.                 XmSelectionBoxCallbackStruct *cbs
  103.         value of the function that have the URL name
  104.    RETURN : void
  105.    DESCRIPTION : This function set the link using the URL name
  106.                  and the reference name and it is inserted to the
  107.          selected text
  108. */
  109.  
  110.  
  111. void 
  112. linker_name(Widget w,
  113.          HTMLED *he, 
  114.          XmSelectionBoxCallbackStruct *cbs)
  115. {
  116.    Widget text_name = (Widget)he->user_data;
  117.    XmTextPosition left=0,right=0;
  118.    int len,lsel=0;
  119.    char *ssel = NULL;
  120.    char *str=NULL,*value=NULL,*sel=NULL;
  121.  
  122.  
  123.    he->last_command = LINKER;
  124.    if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  125.    {
  126.       if(right<=left)
  127.      left = right = XmTextGetInsertionPosition(he->textarea);
  128.    }
  129.    else
  130.       left = right = XmTextGetInsertionPosition(he->textarea);
  131.  
  132.    if(left!=right)
  133.    {
  134.       ssel = XmTextGetSelection(he->textarea);
  135.       lsel = strlen(ssel);
  136.    }
  137.  
  138.    if(cbs->value!=NULL)
  139.    {
  140.       XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
  141.       len = strlen(value);
  142.       str = XtMalloc(len+20);
  143.    }
  144.    sel = XmTextGetString(text_name);
  145.    if(value!=NULL)
  146.    {
  147.       XmTextInsert(he->textarea,right,"</A>");
  148.       if(strlen(sel)==0)
  149.      sprintf(str,"<A HREF=\"%s\">",value);
  150.       else
  151.      sprintf(str,"<A HREF=\"%s#%s\">",value,sel);
  152.  
  153.       XmTextInsert(he->textarea,left,str);
  154.       if(lsel==0)
  155.       {
  156.      if (!strlen(sel))
  157.         XmTextSetInsertionPosition(he->textarea,
  158.                     left+strlen(sel)+strlen(value)+11);
  159.      else
  160.         XmTextSetInsertionPosition(he->textarea,
  161.                     left+strlen(sel)+strlen(value)+12);
  162.       }
  163.       else
  164.       {
  165.      if (!strlen(sel))
  166.         XmTextSetInsertionPosition(he->textarea,
  167.                     left+strlen(sel)+strlen(value)+lsel+15);
  168.      else
  169.         XmTextSetInsertionPosition(he->textarea,
  170.                     left+strlen(sel)+strlen(value)+lsel+16);
  171.       }
  172.    }
  173.    else
  174.    {
  175.       XmTextInsert(he->textarea,left,"<A HREF=\"\"></A> ");
  176.       XmTextSetInsertionPosition(he->textarea,left + 10);
  177.    }
  178.  
  179.    XtFree(str); 
  180.    XtFree(sel);
  181.    XtFree(ssel);
  182.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  183. }
  184. /*
  185.    
  186.    NAME : create_reference
  187.    PARAMETERS : Widget w
  188.                 From what widget this function is called.
  189.    RETURN : void
  190.    DESCRIPTION : This function creates the dialog widget title 
  191.                  to enter the reference name
  192.  
  193. */
  194.  
  195. void 
  196. create_reference(Widget w,HTMLED *he)
  197. {
  198.   Widget dialog;
  199.   XmString rt =
  200.      XmStringCreateLtoR("Referenced text :\n\t",XmSTRING_DEFAULT_CHARSET); 
  201.   XmString sr,r = 
  202.      XmStringCreateLtoR("\n\nReference Name :",XmSTRING_DEFAULT_CHARSET);
  203.   XmString label,clear =XmStringCreateSimple("Clear");
  204.   char *sel_reference=NULL;
  205.   dialog = XmCreatePromptDialog(he->textarea,"Reference",NULL,0);
  206.  
  207.   if(sel_reference = XmTextGetSelection(he->textarea))
  208.   {
  209.      sr = XmStringCreateLtoR(sel_reference,XmSTRING_DEFAULT_CHARSET);
  210.      XtFree(sel_reference);
  211.      label = XmStringConcat(rt,sr);
  212.      XmStringFree(rt);
  213.      rt= XmStringConcat(label,r);
  214.      XmStringFree(sr);
  215.   }
  216.   else
  217.   {
  218.      label = XmStringConcat(rt,r);
  219.      XmStringFree(rt);
  220.      rt = XmStringCopy(label);
  221.   }
  222.   XtVaSetValues(dialog, 
  223.         XmNselectionLabelString,rt,
  224.         XmNapplyLabelString,clear,NULL);
  225.   XmStringFree(label);   XmStringFree(r); XmStringFree(clear);
  226.   
  227.   /* When the user types the Reference name, call linker_name()... */
  228.   XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)reference_name,(XtPointer)he);
  229.    
  230.    /* If the user selects cancel, just detroy the dialog */
  231.   XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); 
  232.   
  233.   /* Clear button is available */
  234.   XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  235.   XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  236.  
  237.   /* No help is available */
  238.   XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  239.  
  240.   XtManageChild(dialog);
  241.   XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  242.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  243.                    0,0,800,800,0,0);
  244. }
  245.  
  246. /*
  247.    
  248.    NAME : reference_name
  249.    PARAMETERS : XmSelectionBoxCallbackStruct *cbs
  250.                 This has the value of the reference name
  251.    RETURN : void
  252.    DESCRIPTION : This function sets the tags of the reference
  253.                  name to the selected text
  254.  
  255. */
  256. void 
  257. reference_name(Widget w,
  258.             XtPointer client_data,
  259.             XmSelectionBoxCallbackStruct *cbs)
  260. {
  261.    HTMLED *he = (HTMLED *)client_data;
  262.    XmTextPosition left=0,right=0;
  263.    int len,lsel=0;
  264.    char *sel=NULL;
  265.    char *str=NULL,*value=NULL;
  266.  
  267.    he->last_command = REFER;
  268.    if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  269.    {
  270.       if(right<=left)
  271.      left = right = XmTextGetInsertionPosition(he->textarea);
  272.    }
  273.    else
  274.       left = right = XmTextGetInsertionPosition(he->textarea);
  275.    
  276.    if(left!=right)
  277.    {
  278.       sel = XmTextGetSelection(he->textarea);
  279.       lsel = strlen(sel);
  280.    }
  281.  
  282.    if(cbs->value!=NULL)
  283.    {
  284.       XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
  285.       len = strlen(value);
  286.       str = XtMalloc(len+20);
  287.    }
  288.    if(value!=NULL)
  289.    {
  290.       if((len==0)&&(lsel==0))
  291.       {
  292.      sprintf(str,"<A NAME=\"\"></A>");
  293.      XmTextInsert(he->textarea,left,str); 
  294.      XmTextSetInsertionPosition(he->textarea,left +11);
  295.       }
  296.       else
  297.       {
  298.      XmTextInsert(he->textarea,right,"</A>");
  299.      sprintf(str,"<A NAME=\"%s\">",value);
  300.      XmTextInsert(he->textarea,left,str);
  301.      if(lsel==0)
  302.         XmTextSetInsertionPosition(he->textarea,left+len+ 11);
  303.      else
  304.         XmTextSetInsertionPosition(he->textarea,left +lsel+len+ 15);
  305.       }
  306.    }
  307.    XtFree(sel);
  308.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  309.    XtFree(str);
  310. }
  311. /*
  312.    
  313.    NAME : create_figure
  314.    PARAMETERS : Widget w
  315.                 From what widget this function is called.
  316.    RETURN : void
  317.    DESCRIPTION : This function creates the dialog widget image
  318.                  to enter the name of the URL  of the image file.
  319.          It has a toggle button to select top or bottom
  320.          aligning with the text.
  321.  
  322. */
  323. void
  324. create_figure(Widget w,HTMLED *he)
  325. {
  326.    Widget dialog,name_box,option_align,togglebutton;
  327.    XmString t = XmStringCreateLtoR("Image Name: \n",XmSTRING_DEFAULT_CHARSET);
  328.    XmString clear =XmStringCreateSimple("Clear");
  329.    XmString bottomal =XmStringCreateSimple("Bottom");
  330.    XmString topal =XmStringCreateSimple("Top");
  331.    XmString middleal =XmStringCreateSimple("Middle");
  332.  
  333.    XmString align_label = XmStringCreateSimple("Alignment :");
  334.    XmString ismapstr =XmStringCreateLtoR("ISMAP\n",XmSTRING_DEFAULT_CHARSET);
  335.  
  336.    ismap = 0; align = TOP_AL;
  337.    dialog = XmCreatePromptDialog(he->textarea,"Image",NULL,0);
  338.    XtVaSetValues(dialog, 
  339.          XmNselectionLabelString,t,
  340.          XmNapplyLabelString,clear,NULL);
  341.    XmStringFree(clear);   XmStringFree(t);
  342.  
  343.    name_box = XmCreateForm(dialog,"namebox",NULL,0);
  344.    
  345.    option_align = XmVaCreateSimpleOptionMenu(name_box,"option_align",
  346.             align_label,'\0',0 /* initial menu selection */,align_cb,
  347.         XmVaPUSHBUTTON,topal,'\0',NULL,NULL,
  348.         XmVaPUSHBUTTON,middleal,'\0',NULL,NULL,
  349.         XmVaPUSHBUTTON,bottomal,'\0',NULL,NULL,
  350.             XmNuserData,he,
  351.         NULL);
  352.    XmStringFree(align_label);   XmStringFree(topal);   
  353.    XmStringFree(bottomal);XmStringFree(middleal);
  354.  
  355.    XtManageChild(option_align);
  356.    
  357.    togglebutton = XmCreateToggleButton(name_box,"toggletop",NULL,0);
  358.    XtManageChild(togglebutton);
  359.    XtVaSetValues(togglebutton,
  360.          XmNlabelString,ismapstr,NULL);
  361.    XtAddCallback(togglebutton,XmNvalueChangedCallback,(XtCallbackProc)ismap_check,NULL);
  362.  
  363.    XmStringFree(ismapstr);
  364.  
  365.    XtVaSetValues(option_align, XmNtopAttachment, XmATTACH_WIDGET, 
  366.          XmNtopWidget,togglebutton,
  367.          XmNleftAttachment, XmATTACH_FORM,
  368.          NULL); 
  369.    XtVaSetValues(togglebutton, XmNtopAttachment, XmATTACH_FORM, 
  370.          XmNleftAttachment, XmATTACH_FORM,
  371.          NULL); 
  372.  
  373.    /* When the user types the Reference name, call linker_name()... */
  374.    XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)image_name,(XtPointer)he);
  375.    
  376.    /* If the user selects cancel, just detroy the dialog */
  377.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL); 
  378.    
  379.    /* Clear button is available */
  380.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  381.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  382.    
  383.    /* No help is available */
  384.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  385.    
  386.    XtManageChild(name_box);
  387.    XtManageChild(dialog);
  388.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  389.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  390.         0,0,800,800,0,0);
  391. }
  392. void 
  393. ismap_check(Widget w,
  394.        XtPointer client_data, XtPointer call_data)
  395. {  
  396.    if(ismap == 0)
  397.       ismap = 1;
  398.    else
  399.       ismap = 0;
  400. }
  401. void 
  402. align_cb(Widget w,
  403.        XtPointer client_data, XtPointer call_data)
  404. {
  405.    int item_no = (int)client_data;
  406.    align = item_no;
  407. }
  408.  
  409. /*
  410.    
  411.    NAME : image_name
  412.    PARAMETERS : XmSelectionBoxCallbackStruct *cbs
  413.                 It has the URL image name 
  414.    RETURN : void
  415.    DESCRIPTION : This function insert the image tag to the
  416.                   current position of the cursor
  417.  
  418. */
  419. void 
  420. image_name(Widget w, 
  421.        XtPointer client_data,
  422.        XmSelectionBoxCallbackStruct *cbs)
  423. {
  424.    HTMLED *he = (HTMLED *)client_data;
  425.    char *imagefile=NULL;
  426.    char *imagename=NULL;
  427.    int len=0;
  428.    XmTextPosition left;
  429.  
  430.    if(cbs->value!=NULL)
  431.    {
  432.       XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&imagefile);
  433.       len = strlen(imagefile);
  434.       imagename = XtMalloc(len+50);
  435.    }
  436.    else
  437.       imagename = XtMalloc(50);
  438.    
  439.    if(imagefile!=NULL)
  440.    {
  441.       if(align==TOP_AL)
  442.      sprintf(imagename,"<IMG ALIGN=\"TOP\" SRC = \"%s\" ",imagefile);
  443.       else if (align == MIDDLE_AL)
  444.      sprintf(imagename,"<IMG ALIGN=\"MIDDLE\" SRC = \"%s\" ",imagefile);
  445.       else
  446.      sprintf(imagename,"<IMG ALIGN=\"BOTTOM\" SRC = \"%s\" ",imagefile);
  447.    }
  448.    else
  449.    {
  450.       printf("Image Error\n");
  451.    }
  452.    if(ismap)
  453.       strcat(imagename," ISMAP");
  454.    strcat(imagename,">");
  455.    len = strlen(imagename);
  456.    left = XmTextGetInsertionPosition(he->textarea);
  457.    XmTextInsert(he->textarea,left,imagename);
  458.    XmTextSetInsertionPosition(he->textarea,left+len);
  459.    XtFree(imagename);
  460.    XtFree(imagefile);
  461.    ismap = 0; align = TOP_AL;
  462.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  463. }
  464. /*
  465.    
  466.    NAME : create_pre
  467.    PARAMETERS : Widget w
  468.                 From what widget this function is called.
  469.    RETURN : void
  470.    DESCRIPTION : This function creates a message dialog widget 
  471.                  to show the selected text to be in preformatted way
  472.  
  473. */
  474.  
  475. void 
  476. create_pre(Widget w,HTMLED *he)
  477. {
  478.    Widget dialog;
  479.    XmString mstring,u,t = 
  480.       XmStringCreateLtoR("Preformatted text is : \n",XmSTRING_DEFAULT_CHARSET);
  481.    XmString t2=      
  482.       XmStringCreateLtoR("Commentary text is : \n",XmSTRING_DEFAULT_CHARSET);
  483.    char *mstr;
  484.     mstr = XmTextGetSelection(he->textarea);
  485.  
  486.    if(strcmp(XtName(w),"button_5"))
  487.       he->user_data = (XtPointer)PRE;
  488.    else
  489.       he->user_data = (XtPointer)COMMENT;
  490.  
  491.    if(mstr)
  492.    {
  493.       dialog = XmCreatePromptDialog(he->textarea,"notice_header",NULL,0);
  494.       mstring = XmStringCreateLtoR(mstr,XmSTRING_DEFAULT_CHARSET);
  495.       if(he->user_data == (XtPointer)PRE)
  496.      u = XmStringConcat(t,mstring);
  497.       else
  498.            u = XmStringConcat(t2,mstring);
  499.       XmStringFree(mstring);XmStringFree(t);XmStringFree(t2);
  500.       XtVaSetValues(dialog,
  501.             XmNselectionLabelString,u,NULL);
  502.       XmStringFree(u);
  503.       /* When the user choose a size of the header, call set_header */
  504.       XtAddCallback(dialog, XmNokCallback,(XtCallbackProc)set_pre,(XtPointer)he);
  505.       
  506.       /* If the user selects cancel, just destroy the header dialog */
  507.       XtAddCallback(dialog, XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  508.       
  509.       /* Nor help neither text is available.... */
  510.       XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_HELP_BUTTON));
  511.       XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT));
  512.       XtManageChild(dialog);
  513.       XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  514.            XtWindow(dialog),
  515.                    0,0,800,800,20,20);
  516.    }
  517.    else
  518.       set_pre(w,he);
  519. }
  520. /*
  521.    
  522.    NAME : set_pre
  523.    PARAMETERS : Widget w
  524.                 From what widget this function is called.
  525.    RETURN : void
  526.    DESCRIPTION : This function sets the preformatted tags
  527.                  to the selected text
  528. */
  529. void 
  530. set_pre(Widget w,HTMLED *he)
  531. {   
  532.    XmTextPosition left=0,right=0;
  533.    int len;
  534.    enum commands flag = (enum commands)he->user_data;
  535.    
  536.    if(flag==PRE)
  537.       he->last_command = PRE;
  538.    else
  539.       he->last_command = COMMENT;
  540.  
  541.    if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  542.    {
  543.       if(right<=left)
  544.      left = right = XmTextGetInsertionPosition(he->textarea);
  545.    }
  546.    else
  547.       left = right = XmTextGetInsertionPosition(he->textarea);
  548.    len = right -left;
  549.    
  550.    if(flag==PRE)
  551.    {
  552.       XmTextInsert(he->textarea,right,"\n</PRE>\n");
  553.       XmTextInsert(he->textarea,left,"\n<PRE>\n");
  554.    }
  555.    else
  556.    {
  557.       XmTextInsert(he->textarea,right," -->");
  558.       XmTextInsert(he->textarea,left,"<!-- ");
  559.    }
  560.    if(len == 0)
  561.    {
  562.       if(flag == PRE)
  563.      XmTextSetInsertionPosition(he->textarea,left + 7);
  564.       else
  565.      XmTextSetInsertionPosition(he->textarea,left + 5);
  566.    }
  567.    else
  568.    {
  569.       if(flag == PRE)
  570.      XmTextSetInsertionPosition(he->textarea,left +len + 15);
  571.       else
  572.      XmTextSetInsertionPosition(he->textarea,left +len + 9);
  573.    }
  574.    he->user_data = NULL;
  575.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); 
  576. }
  577.  
  578.  
  579.  
  580.  
  581.